#ifndef _GPS_DRIVER_H_
#define _GPS_DRIVER_H_

typedef enum {
  false,
  true
} bool;

/* 将所有的相关全局变量用一个结构体来保存 */
typedef struct gps_driver
{
  dev_t              gps_id;	  /* 对应于字符设备的设备号 */
  struct cdev*       gps_chrfile; /* 字符设备 */

  bool               is_open;	  /* 设备只允许被open一次 */
  struct semaphore   open_mutex;  /* 检查is_open的互斥量 */
  unsigned long      usable_time; /* 设备需要时间进行定位，大概1分钟左右 */
  struct semaphore   messaging;	  /* is_messaging的互斥量 */

  struct usb_device* gps_usb_dev; /* 指向usb_device的指针 */
  unsigned int       read_ep;	  /* bulk-in端点 */
} gps_driver;


/* 
   定义来自
   < Universal Serial Bus Communications Class 
   Subclass Specification for PSTN Devices >
   第24页
*/
typedef struct LineCoding
{
  uint32_t        dwDTERate;	/* 串口波特率 */
  uint8_t         bCharFormat;	/* 结束字符 */
  uint8_t         bParityType;	/* 检验位 */
  uint8_t         bDataBits;	/* 数据位长度 */
} line_coding;

#define GPS_TTY_RTS 0x02	/* 主机方请求数据 */
#define GPS_TTY_DTR 0x01	/* 主机PC方准备好 */
#define GPS_TTY_RDY GPS_TTY_RTS|GPS_TTY_DTR

#define RC_SET_LCODING 0x20	/* set line coding的代码，具体见第20页 */
#define RC_GET_LCODING 0X21	/* get line coding的代码 */
#define RC_SET_CTRLLST 0x22	/* set control line state的代码 */

#define OUT_REQUEST 0x21	/* CDC类请求代码，发送方向为主机向usb端发送 */
#define IN_REQUEST  0xa1	/* 方向和上面相反 */

#define OUT_OF_TIME   HZ*10	/* 超时时间 */
#define COMM_SPEED    9600 	/* 在gps mouse上其实不需要调波特率的 */
#define RD_BUFFER_LEN 256	/* 读数据缓冲程度长度 */
#define ep_0          0

#define E581_VENDOR   0x1546
#define E581_PRODUCT  0x01a4
#define INTF_CLASS    0x0a
#define INTF_SUBCLASS 0x00
#define INTF_PROTOCOL 0x01

#endif//_GPS_DRIVER_H_
